home *** CD-ROM | disk | FTP | other *** search
- #ifndef CLIPPINGFILE_H
- #include "ClippingFile.h"
- #endif
-
- #ifndef ST_MACCLASSES_H
- #include "ST_MacClasses.h"
- #endif
-
- #ifndef CLIPPINGFILEDATA_H
- #include "ClippingFileData.h"
- #endif
-
- #ifndef FLYPAPERUTILS_H
- #include "FlyPaperUtils.h"
- #endif
-
- #ifndef FLYPAPERDRAGUTILS_H
- #include "FlyPaperDragUtils.h"
- #endif
-
-
- CClippingFile::CClippingFile (FSSpec& fileOnDisk) :
- fRefNum (0),
- fClippingTOC (0),
- fData (0)
- {
- ST_ResFileSaver saver = CurResFile ();
- ST_ResFileCloser ref = FSpOpenResFile (&fileOnDisk, fsRdWrPerm);
-
- if ((short) ref < 0)
- throw ResError ();
-
- fRefNum = (short) ref;
-
- InitCClippingFile ();
-
- ref.Forget ();
- }
-
- CClippingFile::CClippingFile (short refNum) :
- fRefNum (refNum),
- fClippingTOC (0),
- fData (0)
- {
- ST_ResFileSaver saver = CurResFile ();
- UseResFile (refNum);
-
- InitCClippingFile ();
- }
-
- CClippingFile* CClippingFile::NewClippingFileFromDragItem (DragReference dragRef,
- ItemReference itemRef, Point dropPoint, short tile)
- {
- FSSpec spec;
- OSErr error = FlyPaperFindFolder (kOnSystemDisk, kClippingsFolder, true,
- &spec.vRefNum, &spec.parID);
- if (error)
- throw error;
-
- NumToString (TickCount (), spec.name);
-
- CClippingFile* file = nil;
- unsigned short howManyFlavors;
-
- error = CountDragItemFlavors (dragRef, itemRef, &howManyFlavors);
- if (error)
- throw error;
-
- for (unsigned short whichFlavor = 1; whichFlavor <= howManyFlavors; ++whichFlavor) {
-
- if (AcceptableFlavor (dragRef, itemRef, whichFlavor)) {
- if (file == nil) {
- file = NewClippingFile (spec);
- }
-
- FlavorType type;
- FlavorFlags flags;
- Size size;
-
- error = GetFlavorType (dragRef, itemRef, whichFlavor, &type);
- if (error)
- throw error;
- error = GetFlavorFlags (dragRef, itemRef, type, &flags);
- if (error)
- throw error;
-
- error = GetFlavorDataSize (dragRef, itemRef, type, &size);
- if (error)
- throw error;
-
- /* allocate memory for the drag item */
- Handle data = TempNewHandle (size, &error);
- if (!data) {
- throw error;
- }
-
- ST_Handle dataKiller (data);
- {
- ST_HandleStateSaver dataStateSaver (data);
-
- HLock (data);
- error = GetFlavorData (dragRef, itemRef, type, *data, &size, 0);
- if (error)
- throw error;
- }
-
- file -> AddFlavor (type, data);
-
- WriteResource (data);
- ReleaseResource (data);
- dataKiller.Forget ();
- }
- }
-
- if (file) {
- CClippingFileData* data = file -> GetData ();
- if (!data)
- throw memFullErr;
-
- short offset;
- Boolean onLeft;
-
- ClassifyPoint (dropPoint, &onLeft, &offset);
- data -> SetOnLeft (onLeft);
- data -> SetOffset (offset);
-
-
- }
-
- return file;
- }
-
- void CClippingFile::InitCClippingFile ()
- {
- ST_ResourceHandle toc = Get1Resource (kClippingTOCResType, kClippingTOCResID);
- if (!(Handle) toc)
- throw resNotFound;
-
- fData = new CClippingFileData (fRefNum);
-
- fClippingTOC = (ClippingTOCHandle)(Handle) toc;
- toc.Forget ();
- }
-
- CClippingFile::~CClippingFile ()
- {
- delete fData;
- CloseResFile (fRefNum);
- }
-
- CClippingFile* CClippingFile::NewClippingFile (FSSpec& fileLocation, OSType primaryFlavor)
- {
- OSType fileCreator, fileType;
-
- switch (primaryFlavor) {
- case 'TEXT' :
- fileType = kTextClippingType;
- fileCreator = kFinderClippingSignature;
- break;
-
- case 'snd ' :
- fileType = kSoundClippingType;
- fileCreator = kFinderClippingSignature;
- break;
-
- case 'PICT' :
- fileType = kPictureClippingType;
- fileCreator = kFinderClippingSignature;
- break;
-
- default :
- fileType = kMyClippingType;
- fileCreator = kMyClippingSignature;
- }
-
- ST_ResFileSaver saver = CurResFile ();
-
- FSpCreateResFile (&fileLocation, fileCreator, fileType, smRoman);
- ST_ResFileCloser ref = FSpOpenResFile (&fileLocation, fsRdWrPerm);
- if ((short) ref < 0)
- throw ResError ();
-
- // Create an empty table of contents
- ClippingTOCHandle tocHandle = (ClippingTOCHandle)
- NewHandleClear (sizeof (ClippingTOCRec));
- if (!tocHandle)
- throw ResError ();
-
- (**tocHandle).version = 1;
-
- // Add it to the new clipping file
- AddResource ((Handle) tocHandle, kClippingTOCResType, kClippingTOCResID, "\p");
- OSErr error = ResError ();
- if (error) {
- DisposeHandle ((Handle) tocHandle);
- throw error;
- }
-
- ST_ResourceHandle tocHandleKiller = (Handle)tocHandle;
- CClippingFileData::CreateNewClippingFileData (ref);
-
- WriteResource ((Handle) tocHandle);
-
- tocHandleKiller.Forget ();
- short resFileRefNum = ref;
- ref.Forget ();
-
- return new CClippingFile (resFileRefNum);
- }
-
- void CClippingFile::AddFlavor (const FlavorType flavorType, const Handle flavorData)
- {
- ST_ResFileSaver saver = CurResFile ();
- UseResFile (fRefNum);
-
- Handle flavorRes = Get1Resource (flavorType, kFlavorResID);
- if (flavorRes) {
- RemoveResource (flavorRes);
- DisposeHandle (flavorRes);
- UpdateResFile (fRefNum);
- }
-
- AddResource (flavorData, flavorType, kFlavorResID, "\p");
- OSErr error = ResError ();
- if (error)
- throw error;
-
- ClippingFlavorRec flavorRec;
-
- flavorRec.flavorType = flavorType;
- flavorRec.reserved3 = flavorRec.reserved2 = flavorRec.reserved1 = 0;
-
- error = PtrAndHand (&flavorRec, (Handle) fClippingTOC, sizeof (flavorRec));
- if (error)
- throw error;
-
- ++(**fClippingTOC).flavorCount;
- ChangedResource ((Handle) fClippingTOC);
- }
-
- short CClippingFile::CountFlavors ()
- {
- return (**fClippingTOC).flavorCount;
- }
-
- void CClippingFile::GetIndFlavor (short index, FlavorType& gotFlavor, Handle& gotHandle)
- {
- ClippingTOCRec* clippingTOC = *fClippingTOC;
-
- if (index > clippingTOC -> flavorCount)
- throw paramErr;
-
- FlavorType flavorType = clippingTOC -> flavors [index - 1].flavorType;
-
- ST_ResFileSaver saver = CurResFile ();
- UseResFile (fRefNum);
-
- Handle flavorData = Get1Resource (flavorType, kFlavorResID);
- if (!flavorData)
- throw resNotFound;
-
- gotFlavor = flavorType;
- gotHandle = flavorData;
- }
-
- void CClippingFile::GetIndFlavorType (short index, FlavorType& gotFlavor)
- {
- ClippingTOCRec* clippingTOC = *fClippingTOC;
-
- if (index > clippingTOC -> flavorCount)
- throw paramErr;
-
- gotFlavor = clippingTOC -> flavors [index - 1].flavorType;
- }
-
- DragReference CClippingFile::BuildDragReference ()
- {
- ST_ResFileSaver saver = CurResFile ();
- DragReference dragRef;
-
- OSErr error = NewDrag (&dragRef);
- if (error)
- throw error;
-
- ST_DragReference dragReferenceKiller = dragRef;
- short flavorCount = CountFlavors ();
-
- for (short i = 1; i <= flavorCount; ++i) {
- FlavorType flavorType;
- Handle flavorHandle;
-
- GetIndFlavor (i, flavorType, flavorHandle);
- HLock (flavorHandle);
- error = AddDragItemFlavor (dragRef, (ItemReference) 0, flavorType, *flavorHandle,
- GetHandleSize (flavorHandle), 0);
- ReleaseResource (flavorHandle);
-
- if (error)
- throw error;
- }
-
- dragReferenceKiller.Forget ();
- return dragRef;
- }
-
- void CClippingFile::AddThumbnail (CThumbnail& thumbnail)
- {
- }
-
- CThumbnail* CClippingFile::GetThumbnail ()
- {
- return nil;
- }
-
- Boolean CClippingFile::GetFSSpec (FSSpec& spec)
- {
- FCBPBRec pb;
-
- pb.ioVRefNum = 0;
- pb.ioFCBIndx = 0;
- pb.ioRefNum = fRefNum;
- pb.ioNamePtr = spec.name;
- spec.name [0] = '\0';
-
- OSErr error = PBGetFCBInfoSync (&pb);
- if (error)
- return false;
-
- spec.vRefNum = pb.ioFCBVRefNum;
- spec.parID = pb.ioFCBParID;
- return true;
- }